package jp.seraph.jsade.sexpression;

/**
 * S式のツリーのうちノードを表すインターフェース
 */
public interface Node extends SExpression, Iterable<SExpression> {
    
    /**
     * すべての子がLeafであるかどうかを返す
     * 
     * @return すべての子がLeafであればtrue
     */
    public boolean allChildIsLeaf();
    
    /**
     * このノードに子を追加する。
     * 
     * @param aExpression 追加する子
     */
    public void addChild(SExpression aExpression);
    
    public void insertChild(SExpression aValue, int aIndex);

    /**
     * aValueを値として持つ、Leafをこのノードに追加する。
     *
     * @param aValue
     */
    public void addChild(String aValue);
    
    public void insertChild(String aValue, int aIndex);

    /**
     * 以下の条件に合う子ノードを探し出し、2つ目の子の値を返す。
     *
     * 1. 子の数が2である
     * 2. 全ての子がLeafである
     * 3. 1つ目の子の値がaNameである
     *
     * @param aName
     * @return 条件に合うものがあればその値、なければnull
     */
    public String getValue(String aName);
    
    /**
     * 以下の条件に合う子ノードを探し出し、2つ目以降の子の値を返す。
     *
     * 1. 子の数が2以上である
     * 2. 全ての子がLeafである
     * 3. 1つ目の子の値がaNameである
     *
     * @param aName
     * @return 条件に合うものがあればその値、なければ長さ0の配列
     */
    public String[] getValues(String aName);
}
